---
title: Expensify
sidebarTitle: Expensify
---

import Overview from "/snippets/overview.mdx"
import PreBuiltTooling from "/snippets/generated/expensify/PreBuiltTooling.mdx"
import PreBuiltUseCases from "/snippets/generated/expensify/PreBuiltUseCases.mdx"

<Overview />
<PreBuiltTooling />
<PreBuiltUseCases />

## Access requirements
| Pre-Requisites | Status | Comment|
| - | - | - |
| Paid dev account | ❓ |  |
| Paid test account | ❓ |  |
| Partnership | ❓ | |
| App review | ❓ |  |
| Security audit | ❓ | |


## Setup guide

_No setup guide yet._

<Tip>Need help getting started? Get help in the [community](https://nango.dev/slack).</Tip>

<Note>Contribute improvements to the setup guide by [editing this page](https://github.com/nangohq/nango/tree/master/docs/integrations/all/expensify.mdx)</Note>


## Useful links

-   [Generate API credentials](https://www.expensify.com/tools/integrations/)
-   [API docs](https://integrations.expensify.com/Integration-Server/doc)
-   [Auth-related docs](https://integrations.expensify.com/Integration-Server/doc/#authentication)

<Note>Contribute useful links by [editing this page](https://github.com/nangohq/nango/tree/master/docs/integrations/all/expensify.mdx)</Note>


## API gotchas
- Expensify in Nango uses `Basic` auth mode to access different endpoints. Provide your `partnerUserID` as the Username value and `partnerUserSecret` as the Password value.
- After creating a connection, you can use the Basic credentials as follows;
```js
const connection = await nango.getConnection();
let credentials: { partnerUserID?: string; partnerUserSecret?: string } = {};
        if ('username' in connection.credentials && 'password' in connection.credentials) {
            credentials = {
                partnerUserID: connection.credentials.username,
                partnerUserSecret: connection.credentials.password,
            };
        } else {
            throw new nango.ActionError({
                message: `Basic API credentials are incomplete`
            });
        }
        const postData = 'requestJobDescription=' + encodeURIComponent(JSON.stringify({
            type: input.requestJobDescription.type,
            credentials: credentials,
            inputSettings: {
                type: input.inputSettings.type
            }
        }));

        const resp = await nango.post({
            baseUrlOverride: `https://integrations.expensify.com/Integration-Server`,
            endpoint: `/ExpensifyIntegrations`,
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
            },
            data: postData,
        });
```
- You can have a look at the [pre-built integrations](#pre-built-integrations)
- Every request has to be made against the same endpoint.
- Expensify enforces a general rate limit of 50 jobs started per minute.

<Note>Contribute API gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs/integrations/all/expensify.mdx)</Note>

<Card title="Connect to expensify" icon="link" href="/integrations/all/expensify/connect" horizontal>
  Guide to connect to Expensify using Nango Connect.
</Card>
